﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using QuanLyKho.Server.BLL;
using QuanLyKho.Server;
using System.ComponentModel;
using DevExpress.Xpf.Grid;
using DevExpress.Xpf.Bars;
using DevExpress.Xpf.Core;
using DevExpress.XtraEditors.DXErrorProvider;
using DevExpress.Xpf.Docking;
using QuanLyKho.CommonControl;
using QuanLyKho.Server.Enum;

namespace QuanLyKho
{
    /// <summary>
    /// Interaction logic for ucXuatKho.xaml
    /// </summary>
    public partial class ucXuatKho : UserControl
    {
        #region Fields

        private PhieuXuatThuocBLL phieuXuatBLL;
        private PhieuXuatThuocChiTietBLL phieuXuatChiTietBLL;
        private PhieuNhapThuocChiTietBLL NhapThuocChiTietThuocBLL;
        private TonKhoThuocBLL tonKhoThuocBLL;

        public PhieuXuatThuoc phieuXuatCurrent;
        private BindingList<PhieuXuatThuocChiTiet> listChiTiet;
        private List<PhieuNhapThuocChiTiet> listThuoc;

        // Field cần phải Reset sau khi lưu
        private string validationError;
        private bool? isDialogShowed;
        private PhieuNhapThuocChiTiet NhapThuocChon;
        private bool leftNewRow;
        private List<PhieuXuatThuocChiTiet> listChiTietUpdate;

        // Field bắt buộc set trước khi khởi tạo form
        public bool LaPhieuTra { get; set; }

        #endregion

        public ucXuatKho()
        {
            InitializeComponent();
            phieuXuatBLL = new PhieuXuatThuocBLL();
            phieuXuatChiTietBLL = new PhieuXuatThuocChiTietBLL();
            NhapThuocChiTietThuocBLL = new PhieuNhapThuocChiTietBLL();
            tonKhoThuocBLL = new TonKhoThuocBLL();

            listChiTietUpdate = new List<PhieuXuatThuocChiTiet>();
            listThuoc = new List<PhieuNhapThuocChiTiet>();
        }

        private void UserControl_Loaded(object sender, RoutedEventArgs e)
        {
            // Nếu khởi động form phiếu nhập trên menu thì phieuNhapCurrent = null và khởi tạo thêm mới form
            if (phieuXuatCurrent == null)
            {
                btnThemMoi_ItemClick(null, null);
            }
            else
            {
                // Trường hợp ngược lại thì load phiếu nhập lên
                BindPhieuXuat();
            }
        }

        public void BindPhieuXuat()
        {
            txtIdPhieuXuat.Text = phieuXuatCurrent.IdPhieuXuat.ToString();
            deNgayXuat.EditValue = phieuXuatCurrent.NgayXuat;
            BindPhieuXuatChiTiet(phieuXuatCurrent.IdPhieuXuat);
            if (phieuXuatCurrent.TrangThai == EnumTrangThaiPhieu.DaChotKy)
            {
                txtIdPhieuXuat.Text = phieuXuatCurrent.IdPhieuXuat.ToString() + " (Đã chốt kỳ) ";
                deNgayXuat.IsReadOnly = true;
                gridChiTiet.View.AllowEditing = false;
                SetEnableButton(false, false, false);
            }
        }

        public void BindPhieuXuatChiTiet(int idPhieuXuat)
        {
            try
            {
                listChiTiet = new BindingList<PhieuXuatThuocChiTiet>(phieuXuatChiTietBLL.RetrievePhieuXuatChiTiet(idPhieuXuat));
                gridChiTiet.ItemsSource = listChiTiet;
            }
            catch (Exception)
            {
                DXMessageBox.Show("Thiết lập thông tin phiếu nhập chi tiết không thành công", "Thông báo", MessageBoxButton.OK, MessageBoxImage.Error);
            }
        }

        private void colSoluong_Validate(object sender, DevExpress.Xpf.Grid.GridCellValidationEventArgs e)
        {
            try
            {
                validationError = string.Empty;
                if (!CheckSoLuong(e.Row as PhieuXuatThuocChiTiet, e.Value as int?, ref validationError, true))
                {
                    tbvChiTiet.FocusedColumn = colSoLuong;
                    e.IsValid = false;
                    e.SetError(validationError, ErrorType.Critical);
                }
            }
            catch (Exception ex)
            {
                DXMessageBox.Show("Kiểm tra số lượng không thành công", "Thông báo", MessageBoxButton.OK, MessageBoxImage.Error);
                DXMessageBox.Show(ex.Message + "\n" + ex.InnerException + "\n" + ex.StackTrace, "Thông báo", MessageBoxButton.OK, MessageBoxImage.Error);
            }
        }

        private void tbvChiTiet_InvalidRowException(object sender, DevExpress.Xpf.Grid.InvalidRowExceptionEventArgs e)
        {
            e.ExceptionMode = DevExpress.Xpf.Grid.ExceptionMode.NoAction;
        }

        private void colGiaXuat_Validate(object sender, DevExpress.Xpf.Grid.GridCellValidationEventArgs e)
        {
            try
            {
                validationError = string.Empty;
                if (e.Value == null)
                {
                    validationError = "Giá bán không hợp lệ !!!";
                    e.IsValid = false;
                    e.SetError(validationError, ErrorType.Warning);
                }
                else
                {
                    if (Convert.ToDouble(e.Value) <= 0)
                    {
                        validationError = "Giá bán không hợp lệ !!!";
                        e.IsValid = false;
                        e.SetError(validationError, ErrorType.Warning);
                    }
                    else
                        e.IsValid = true;
                }
            }
            catch (Exception)
            {
                DXMessageBox.Show("Kiểm tra giá bán không thành công", "Thông báo", MessageBoxButton.OK, MessageBoxImage.Error);
            }
        }

        private void deNgayXuat_Validate(object sender, DevExpress.Xpf.Editors.ValidationEventArgs e)
        {
            try
            {
                validationError = string.Empty;
                if (string.IsNullOrWhiteSpace(deNgayXuat.DisplayText))
                {
                    validationError = "Vui lòng nhập thông tin ngày xuất !!!";
                    e.IsValid = false;
                    e.SetError(validationError, ErrorType.Warning);
                }
                else
                {
                    // Trường hợp là ngày xuất phải lớn hơn ngày chốt sổ
                    if (!tonKhoThuocBLL.LaChoPhepXuatNhapKho(Convert.ToDateTime(e.Value)))
                    {
                        validationError = "Ngày xuất không thể trước ngày đã chốt sổ !!!";
                        e.IsValid = false;
                        e.SetError(validationError, ErrorType.Warning);
                    }
                    else
                    {
                        e.IsValid = true;
                    }
                }
            }
            catch (Exception)
            {
                DXMessageBox.Show("Kiểm tra ngày xuất không thành công", "Thông báo", MessageBoxButton.OK, MessageBoxImage.Error);
            }
        }

        public void btnThemMoi_ItemClick(object sender, DevExpress.Xpf.Bars.ItemClickEventArgs e)
        {
            try
            {
                // Reset thông tin phiếu nhập
                phieuXuatCurrent = null;
                txtIdPhieuXuat.Clear();
                deNgayXuat.EditValue = DateTime.Now;

                BindPhieuXuatChiTiet(0);
                ResetField();

                SetEnableButton(false, false, false);

                gridChiTiet.Focus();
                FocusHomeCommand.Execute(null, null);
            }
            catch (Exception)
            {
                DXMessageBox.Show("Thêm mới không thành công", "Thông báo", MessageBoxButton.OK, MessageBoxImage.Error);
            }

        }

        private bool KiemTraThongTinPhieuXuat()
        {
            bool isExistingError = false;
            try
            {
                deNgayXuat.CausesValidation = true;
                deNgayXuat.DoValidate();
                if (deNgayXuat.HasValidationError)
                {
                    isExistingError = true;
                }
            }
            catch (Exception)
            {
                isExistingError = false;
                DXMessageBox.Show("Kiểm tra phiếu xuất không thành công", "Thông báo", MessageBoxButton.OK, MessageBoxImage.Error);
            }

            return isExistingError;
        }

        /// <summary>
        /// Kiểm tra grid chi tiết
        /// </summary>
        /// <returns></returns>
        public bool KiemTraThongTinChiTiet()
        {
            try
            {
                string errorString = string.Empty;
                for (int index = 0; index < this.gridChiTiet.VisibleRowCount; index++)
                {
                    PhieuXuatThuocChiTiet chiTiet = gridChiTiet.GetRow(index) as PhieuXuatThuocChiTiet;
                    if (chiTiet.PhieuNhapThuocChiTiet != null && !string.IsNullOrEmpty(chiTiet.PhieuNhapThuocChiTiet.MaThuoc))
                    {
                        if (!CheckSoLuong(chiTiet, chiTiet.SoLuong, ref errorString, false))
                        {
                            DXMessageBox.Show(errorString, "Thông báo", MessageBoxButton.OK, MessageBoxImage.Warning);
                            tbvChiTiet.Focus();
                            tbvChiTiet.FocusedRowHandle = index;
                            tbvChiTiet.FocusedRowHandle = index;
                            tbvChiTiet.FocusedColumn = colSoLuong;
                            return false;
                        }
                    }
                }
            }
            catch (Exception)
            {
                DXMessageBox.Show("Kiểm tra phiếu xuất chi tiết không thành công", "Thông báo", MessageBoxButton.OK, MessageBoxImage.Error);
                return false;
            }
            return true;
        }

        private void btnLuu_ItemClick(object sender, DevExpress.Xpf.Bars.ItemClickEventArgs e)
        {
            try
            {
                gridChiTiet.Focus();
                btnLuu.Focus();

                // Kiểm tra lỗi nếu xảy ra lỗi thì kết thúc xử lý
                if (KiemTraThongTinPhieuXuat())
                {
                    DXMessageBox.Show("Kiểm tra lại thông tin đã nhập", "Thông báo", MessageBoxButton.OK, MessageBoxImage.Warning);
                    return;
                }

                if (!KiemTraThongTinChiTiet())
                {
                    return;
                }

                // Thực hiện tạo phiếu nhập hoặc cập nhật phiếu nhập
                if (phieuXuatCurrent == null || (phieuXuatCurrent != null && phieuXuatCurrent.IdPhieuXuat == 0))
                {
                    phieuXuatCurrent = new PhieuXuatThuoc();
                    phieuXuatCurrent.NgayXuat = Convert.ToDateTime(deNgayXuat.EditValue);

                    // Tạo phiếu nhập
                    phieuXuatBLL.CreatePhieuXuat(phieuXuatCurrent);

                    // Thêm phiếu xuất vừa được tạo vào danh sách bên trái của form Main
                    QuanLyKhoGlobal.ListPhieuXuatThuoc.Insert(0, phieuXuatCurrent);
                }
                else
                {
                    phieuXuatCurrent.NgayXuat = Convert.ToDateTime(deNgayXuat.EditValue);
                    phieuXuatBLL.UpdatePhieuXuat(phieuXuatCurrent);

                    // Cập nhật phiếu xuất vừa được tạo vào danh sách bên trái của form Main
                    PhieuXuatThuoc phieuNhapTruocDo = QuanLyKhoGlobal.ListPhieuXuatThuoc.Where(u => u.IdPhieuXuat == phieuXuatCurrent.IdPhieuXuat).FirstOrDefault();
                    if (phieuNhapTruocDo != null)
                    {
                        phieuNhapTruocDo = phieuXuatCurrent;
                    }

                    // Refresh phiếu nhập
                    (QuanLyKhoGlobal.MainWindow as MainWindow).RefreshPhieuXuat();
                }

                // Thực hiện tạo chi tiết phiếu nhập
                if (!phieuXuatChiTietBLL.CreatePhieuXuatChiTiet(phieuXuatCurrent
                                                            , listChiTiet.Where(u => u.IdPhieuXuatChiTiet == 0).ToList()
                                                            , listChiTietUpdate))
                {
                    DXMessageBox.Show("Lưu thông tin chi tiết không thành công", "Thông báo", MessageBoxButton.OK, MessageBoxImage.Error);
                    return;
                }

                // Thực hiện load lại thông tin grid chi tiết
                BindPhieuXuatChiTiet(phieuXuatCurrent.IdPhieuXuat);

                DXMessageBox.Show("Lưu thông tin thành công", "Thông báo", MessageBoxButton.OK, MessageBoxImage.Information);

                if (string.IsNullOrEmpty(txtIdPhieuXuat.DisplayText))
                {
                    txtIdPhieuXuat.Text = phieuXuatCurrent.IdPhieuXuat.ToString();
                }

                SetEnableButton(false, false, listChiTiet.Count > 0);
            }
            catch (Exception)
            {
                DXMessageBox.Show("Lưu thông tin không thành công", "Thông báo", MessageBoxButton.OK, MessageBoxImage.Error);
            }
        }

        private void btnXoa_ItemClick(object sender, DevExpress.Xpf.Bars.ItemClickEventArgs e)
        {
            try
            {
                PhieuXuatThuocChiTiet chiTiet = gridChiTiet.GetFocusedRow() as PhieuXuatThuocChiTiet;
                if (chiTiet == null)
                    return;

                if (DXMessageBox.Show("Bạn chắc chắn xóa thông tin này ?", "Thông báo", MessageBoxButton.YesNo, MessageBoxImage.Question) == MessageBoxResult.Yes)
                {
                    // Nếu item có tồn tại trong CSDL thì xóa trong CSDL và trừ kho
                    if (chiTiet.IdPhieuXuatChiTiet != 0)
                    {
                        if (!phieuXuatChiTietBLL.DeletePhieuXuatChiTiet(chiTiet.IdPhieuXuatChiTiet))
                        {
                            DXMessageBox.Show("Xóa thông tin chi tiết không thành công !", "Thông báo", MessageBoxButton.OK, MessageBoxImage.Error);
                            return;
                        }
                    }

                    // Xóa item cần xóa
                    listChiTiet.Remove(chiTiet);

                    // Load lại danh sách chi tiết phiếu nhập
                    gridChiTiet.ItemsSource = listChiTiet;

                    SetEnableButton(btnLuu.IsEnabled, btnHuyBo.IsEnabled, listChiTiet.Count > 0);
                }
            }
            catch (Exception)
            {
                DXMessageBox.Show("Xóa thông tin không thành công !", "Thông báo", MessageBoxButton.OK, MessageBoxImage.Error);
            }
        }

        private void btnDong_ItemClick(object sender, ItemClickEventArgs e)
        {
            DockLayoutManager dockLayoutManager = this.Parent as DockLayoutManager;
            if (dockLayoutManager != null)
            {
                BaseLayoutItem bli = dockLayoutManager.ActiveMDIItem;
                if (bli != null)
                {
                    dockLayoutManager.DockController.Close(bli);
                }
            }
            else
            {
                DXWindow window = this.Parent as DXWindow;
                if (window != null)
                {
                    window.Close();
                }
            }
        }

        private void btnHuyBo_ItemClick(object sender, DevExpress.Xpf.Bars.ItemClickEventArgs e)
        {
            try
            {
                if (phieuXuatCurrent == null || (phieuXuatCurrent != null && phieuXuatCurrent.IdPhieuXuat == 0))
                {
                    btnThemMoi_ItemClick(null, null);
                }
                else
                {
                    ResetField();
                    BindPhieuXuatChiTiet(phieuXuatCurrent.IdPhieuXuat);
                    SetEnableButton(false, false, listChiTiet.Count > 0);
                }
            }
            catch (Exception)
            {
                DXMessageBox.Show("Hủy bỏ thông tin không thành công", "Thông báo", MessageBoxButton.OK, MessageBoxImage.Error);
            }

        }

        private void tbvChiTiet_FocusedRowChanged(object sender, DevExpress.Xpf.Grid.FocusedRowChangedEventArgs e)
        {
            try
            {
                if (gridChiTiet.VisibleRowCount == 1 && tbvChiTiet.FocusedRow == null)
                {
                    tbvChiTiet.MoveFirstRow();
                }
                //Neu !=null la da nhap lieu xong tren dong moi va da~ hoan thanh bam xuong' hoac Enter
                if (leftNewRow)
                    FocusHomeCommand.Execute(null, null);
            }
            catch (Exception)
            {
                DXMessageBox.Show("FocusedRowChanged không thành công", "Thông báo", MessageBoxButton.OK, MessageBoxImage.Error);
            }
            
        }

        private void tbvChiTiet_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
        {
            leftNewRow = false;
        }

        private void tbvChiTiet_RowUpdated(object sender, RowEventArgs e)
        {
            try
            {
                if (e.RowHandle == GridControl.NewItemRowHandle)
                {
                    PhieuXuatThuocChiTiet chiTiet = e.Row as PhieuXuatThuocChiTiet;
                    if (chiTiet != null)
                        leftNewRow = true;
                }
            }
            catch (Exception)
            {
                DXMessageBox.Show("RowUpdated không thành công", "Thông báo", MessageBoxButton.OK, MessageBoxImage.Error);
            }
            
        }

        private void deNgayXuat_EditValueChanging(object sender, DevExpress.Xpf.Editors.EditValueChangingEventArgs e)
        {
            try
            {
                if (e.NewValue != null && e.OldValue != null)
                {
                    if (Convert.ToDateTime(e.OldValue).Date != Convert.ToDateTime(e.NewValue).Date)
                    {
                        SetEnableButton(true, true, listChiTiet.Count > 0);
                    }
                }
            }
            catch (Exception)
            {
                DXMessageBox.Show("Thay đổi ngày xuất không thành công", "Thông báo", MessageBoxButton.OK, MessageBoxImage.Error);
            }
        }

        private void txtSoHoaDon_KeyDown(object sender, KeyEventArgs e)
        {
            SetEnableButton(true, true, listChiTiet.Count > 0);
        }

        public bool CheckMaThuoc(string maThuoc)
        {
            if (string.IsNullOrEmpty(maThuoc))
            {
                validationError = "Vui lòng nhập mã thuốc";
                return false;
            }

            if (NhapThuocChiTietThuocBLL.RetrieveAllPhieuNhapChiTietConTrongKho(maThuoc, null).Count == 0)
            {
                validationError = "Mã thuốc không hợp lệ";
                return false;
            }

            return true;
        }

        private void colMaThuoc_Validate(object sender, GridCellValidationEventArgs e)
        {
            try
            {
                validationError = string.Empty;
                if (!CheckMaThuoc((string)e.Value))
                {
                    tbvChiTiet.FocusedColumn = colMaThuoc;
                    e.IsValid = false;
                    e.SetError(validationError, ErrorType.Critical);
                }
            }
            catch (Exception)
            {
                DXMessageBox.Show("Kiểm tra mã thuốc không thành công", "Thông báo", MessageBoxButton.OK, MessageBoxImage.Error);
            }
        }

        private void tbvChiTiet_ValidateRow(object sender, DevExpress.Xpf.Grid.GridRowValidationEventArgs e)
        {
            try
            {
                PhieuXuatThuocChiTiet chiTietNewOrUpdate = (PhieuXuatThuocChiTiet)e.Row;
                if (chiTietNewOrUpdate == null)
                    return;

                if (!CheckMaThuoc(chiTietNewOrUpdate.PhieuNhapThuocChiTiet.MaThuoc))
                {
                    tbvChiTiet.FocusedColumn = colMaThuoc;
                    e.IsValid = false;
                    e.SetError(validationError, ErrorType.Critical);
                    return;
                }

                AddToListUpdateChiTiet(chiTietNewOrUpdate);
                NhapThuocChon = null;
                validationError = string.Empty;
                leftNewRow = false;
            }
            catch (Exception)
            {
                DXMessageBox.Show("Kiểm tra dòng dữ liệu chi tiết không thành công", "Thông báo", MessageBoxButton.OK, MessageBoxImage.Error);
            }
        }

        private void tbvChiTiet_PreviewKeyDown(object sender, KeyEventArgs e)
        {
            try
            {
                int rowHandle = tbvChiTiet.FocusedRowHandle;
                if (e.Key == Key.Enter)
                {
                    SetEnableButton(true, true, listChiTiet.Count > 0);
                    int colIndex = gridChiTiet.Columns.IndexOf(tbvChiTiet.FocusedColumn);
                    // Trường hợp nhấn Enter khi con trỏ đang ở các column: Mã thuốc
                    // Và: isAllowEditing = true (cho phép insert, update)
                    if ((gridChiTiet.Columns[colIndex].FieldName == "PhieuNhapThuocChiTiet.MaThuoc")
                        && (this.colMaThuoc.ReadOnly == false) && e.OriginalSource is TextBox)
                    {
                        TextBox maThuocTextbox = (TextBox)e.OriginalSource;
                        LayThuocTrongPhieuNhap(maThuocTextbox, null, 0);
                        tbvChiTiet.FocusedColumn = colSLConLai;
                    }
                    if ((gridChiTiet.Columns[colIndex].FieldName == "PhieuNhapThuocChiTiet.TenThuoc")
                        && (this.colTenThuoc.ReadOnly == false) && e.OriginalSource is TextBox)
                    {
                        TextBox tenThuocTextbox = (TextBox)e.OriginalSource;
                        LayThuocTrongPhieuNhap(null, tenThuocTextbox, 1);
                        tbvChiTiet.FocusedColumn = colSLConLai;
                    }
                    if ((gridChiTiet.Columns[colIndex].FieldName == "SoLuong")
                        && (this.colSoLuong.ReadOnly == false) && e.OriginalSource is TextBox)
                    {
                        if (rowHandle >= 0)
                        {
                            tbvChiTiet.FocusedColumn = colSLConLai;
                            tbvChiTiet.FocusedRowHandle = rowHandle + 1;
                            tbvChiTiet.FocusedColumn = colSoLuong;
                        }
                        else
                            tbvChiTiet.FocusedColumn = colSLConLai;

                    }
                    if ((gridChiTiet.Columns[colIndex].FieldName == "GiaXuat")
                        && (this.colGiaXuat.ReadOnly == false) && e.OriginalSource is TextBox)
                    {
                        if (rowHandle >= 0)
                        {
                            tbvChiTiet.FocusedColumn = colSLConLai;
                            tbvChiTiet.FocusedRowHandle = rowHandle + 1;
                            tbvChiTiet.FocusedColumn = colGiaXuat;
                        }
                        else
                            tbvChiTiet.FocusedColumn = colSLConLai;

                    }
                    if ((gridChiTiet.Columns[colIndex].FieldName == "PhieuNhapThuocChiTiet.TenNhaPhanPhoi")
                       && (this.colGiaXuat.ReadOnly == false) && e.OriginalSource is TextBox)
                    {
                        if (rowHandle >= 0)
                        {
                            tbvChiTiet.FocusedColumn = colNhaPhanPhoi;
                            tbvChiTiet.FocusedRowHandle = rowHandle + 1;
                            tbvChiTiet.FocusedColumn = colNhaPhanPhoi;
                        }
                        else
                            tbvChiTiet.FocusedColumn = colSLConLai;

                    }
                    if (e.OriginalSource is TableView)
                    {
                        tbvChiTiet.FocusedColumn = colMaThuoc;
                        tbvChiTiet.FocusedColumn = colTenThuoc;
                    }
                }
                else if (e.Key == Key.Up)
                {
                    if (rowHandle == 0)
                        tbvChiTiet.FocusedColumn = colTenThuoc;
                }
                else if (e.Key == Key.Escape)
                {
                    validationError = string.Empty;
                    tbvChiTiet.CancelRowEdit();
                    if (rowHandle < 0)
                        tbvChiTiet.DeleteRow(rowHandle);
                }
                else if (e.Key == Key.Down)
                    leftNewRow = false;
                else
                    SetEnableButton(true, true, true);
            }
            catch (Exception)
            {
                DXMessageBox.Show("Tương tác không thành công", "Thông báo", MessageBoxButton.OK, MessageBoxImage.Error);
            }
        }

        /// <summary>
        /// Lay danh sach thuoc trong phiếu nhập
        /// </summary>
        /// <param name="maThuocTextbox"></param>
        public void LayThuocTrongPhieuNhap(TextBox maThuocTextbox, TextBox tenThuocTextBox, byte focusColumn)
        {
            frmXuatKhoTimKiemThuoc timKiemThuoc = new frmXuatKhoTimKiemThuoc();
            timKiemThuoc.WindowStartupLocation = WindowStartupLocation.CenterScreen;
            timKiemThuoc.ResizeMode = ResizeMode.CanResize;
            timKiemThuoc.Width = timKiemThuoc.Width + 10;
            timKiemThuoc.Height = timKiemThuoc.Height + 10;
            timKiemThuoc.Title = "Chọn thuốc trong danh sách";
            ThemeManager.SetThemeName(timKiemThuoc, "Office2007Blue");
            listThuoc = NhapThuocChiTietThuocBLL.RetrieveAllPhieuNhapChiTietConTrongKho();
            timKiemThuoc.SearchThuoc(listThuoc, maThuocTextbox != null ? maThuocTextbox.Text : string.Empty, tenThuocTextBox != null ? tenThuocTextBox.Text : string.Empty, focusColumn);
            if (timKiemThuoc.rowCount > 1)
                isDialogShowed = timKiemThuoc.ShowDialog();
            if (timKiemThuoc.PhieuNhapChiTietChon == null)
            {
                isDialogShowed = null;
                if (focusColumn == 0)
                    maThuocTextbox.Text = string.Empty;
                else if (focusColumn == 1)
                    tenThuocTextBox.Text = string.Empty;
                return;
            }
            else
            {
                NhapThuocChon = timKiemThuoc.PhieuNhapChiTietChon;
                if (focusColumn == 0)
                    maThuocTextbox.Text = NhapThuocChon.MaThuoc;
                else if (focusColumn == 1)
                    tenThuocTextBox.Text = NhapThuocChon.Dm_Thuoc.TenThuoc;
            }
        }

        private void tbvChiTiet_CellValueChanged(object sender, CellValueChangedEventArgs e)
        {
            try
            {
                PhieuXuatThuocChiTiet phieuChiTiet = e.Row as PhieuXuatThuocChiTiet;
                if (phieuChiTiet == null || e.Value == null)
                    return;
                if (e.Column.FieldName == "PhieuNhapThuocChiTiet.MaThuoc")
                {
                    // Trường hợp nhập nhập mã thuốc rồi tab không bấm Enter
                    if (isDialogShowed == null)
                    {
                        NhapThuocChon = NhapThuocChiTietThuocBLL.RetrieveAllPhieuNhapChiTietConTrongKho(e.Value.ToString(), null).FirstOrDefault();
                        if (NhapThuocChon == null)
                        {
                            isDialogShowed = null;
                            return;
                        }
                    }
                    phieuChiTiet.PhieuNhapThuocChiTiet = NhapThuocChon;
                    phieuChiTiet.IdPhieuNhapChiTiet = NhapThuocChon.IdPhieuNhapChiTiet;
                    phieuChiTiet.GiaXuat = NhapThuocChon.GiaXuat;
                    phieuChiTiet.SoLuong = 0;
                    isDialogShowed = null;
                    NhapThuocChon = null;
                }
                else if (e.Column.FieldName == "PhieuNhapThuocChiTiet.TenThuoc")
                {
                    if (isDialogShowed == null)
                    {
                        NhapThuocChon = NhapThuocChiTietThuocBLL.RetrieveAllPhieuNhapChiTietConTrongKho(null, e.Value.ToString()).FirstOrDefault();
                        if (NhapThuocChon == null)
                        {
                            isDialogShowed = null;
                            return;
                        }
                    }

                    phieuChiTiet.PhieuNhapThuocChiTiet = NhapThuocChon;
                    phieuChiTiet.IdPhieuNhapChiTiet = NhapThuocChon.IdPhieuNhapChiTiet;
                    phieuChiTiet.GiaXuat = NhapThuocChon.GiaXuat;
                    phieuChiTiet.SoLuong = 0;
                    isDialogShowed = null;
                    NhapThuocChon = null;
                }

                // Add vào danh sách cần Update
                AddToListUpdateChiTiet(phieuChiTiet);
                SetEnableButton(true, true, listChiTiet.Count > 0);
            }
            catch (Exception)
            {
                DXMessageBox.Show("Thiết lập thông tin không thành công", "Thông báo", MessageBoxButton.OK, MessageBoxImage.Error);
            }
        }

        private void AddToListUpdateChiTiet(PhieuXuatThuocChiTiet phieuChiTiet)
        {
            if (phieuChiTiet.IdPhieuXuat > 0)
            {
                PhieuXuatThuocChiTiet dtoTrungLap = null;
                foreach (PhieuXuatThuocChiTiet item in listChiTietUpdate)
                {
                    if (item.IdPhieuXuat == phieuChiTiet.IdPhieuXuat)
                    {
                        dtoTrungLap = item;
                        break;
                    }
                }

                if (dtoTrungLap != null)
                {
                    listChiTietUpdate.Remove(dtoTrungLap);
                    dtoTrungLap = null;
                }

                listChiTietUpdate.Add(phieuChiTiet);
            }
        }

        private void tbvChiTiet_InitNewRow(object sender, InitNewRowEventArgs e)
        {
            try
            {
                PhieuXuatThuocChiTiet xuatChiTiet = gridChiTiet.GetRow(GridControl.NewItemRowHandle) as PhieuXuatThuocChiTiet;
                xuatChiTiet.PhieuNhapThuocChiTiet = new PhieuNhapThuocChiTiet();
                xuatChiTiet.PhieuNhapThuocChiTiet.Dm_Thuoc = new Dm_Thuoc();
            }
            catch (Exception)
            {
                DXMessageBox.Show("Khởi tạo thông tin thuốc dòng mới không thành công", "Thông báo", MessageBoxButton.OK, MessageBoxImage.Error);
            }
        }

        /// <summary>
        /// Kiem tra so luong trên grid chi tiêt
        /// </summary>
        /// <param name="soLuong"></param>
        /// <returns></returns>
        private bool CheckSoLuong(PhieuXuatThuocChiTiet chiTiet, object soLuong, ref string errorString, bool isCell)
        {
            if (soLuong == null)
            {
                errorString = "Vui lòng nhập số lượng ";
                return false;
            }

            int soLuongInt = Convert.ToInt32(soLuong);
            if (soLuongInt <= 0)
            {
                errorString = "Số lượng không hợp lệ";
                return false;
            }

            if (isCell)
            {
                PhieuNhapThuocChiTiet nhapChiTiet = chiTiet.PhieuNhapThuocChiTiet;
                // Lấy thông tin số lượng từ db ra so sánh
                PhieuNhapThuocChiTiet phieuNhapThuocChiTietDB = null;
                bool laCoThayDoiSoLuong = NhapThuocChiTietThuocBLL.LaCoThayDoiSoLuong(nhapChiTiet.IdPhieuNhapChiTiet, soLuongInt, out phieuNhapThuocChiTietDB);
                if (nhapChiTiet != null && soLuongInt > phieuNhapThuocChiTietDB.SoLuongConLai)
                {
                    errorString = "Số lượng trong kho còn lại: " + nhapChiTiet.SoLuongConLai + " " + nhapChiTiet.TenDonViTinh;
                    return false;
                }
            }
            else
            {
                // Trường hợp tạo mới phiếu xuất thuốc chi tiết thì đề phòng trường 2 dòng đều 1 loại thuốc mà tổng số lượng 2 dòng > số lượng còn lại
                PhieuNhapThuocChiTiet nhapChiTiet = chiTiet.PhieuNhapThuocChiTiet;
                if (chiTiet.IdPhieuXuatChiTiet == 0)
                {
                    int tongSLYeuCau = listChiTiet.Where(u => u.PhieuNhapThuocChiTiet.MaThuoc == nhapChiTiet.MaThuoc
                                            && u.PhieuNhapThuocChiTiet.SoLo == nhapChiTiet.SoLo
                                            && u.IdPhieuXuatChiTiet == 0).Sum(u => u.SoLuong);
                    if (tongSLYeuCau > nhapChiTiet.SoLuongConLai)
                    {
                        errorString = "Số lượng trong kho còn lại: " + nhapChiTiet.SoLuongConLai + " " + nhapChiTiet.TenDonViTinh
                                        + " \nKiểm tra lại số lượng của thuốc " + nhapChiTiet.Dm_Thuoc.TenThuoc;
                        return false;
                    }
                }
            }

            return true;
        }

        public void ResetField()
        {
            validationError = string.Empty;
            isDialogShowed = null;
            NhapThuocChon = null;
            leftNewRow = false;
            listChiTietUpdate = new List<PhieuXuatThuocChiTiet>();
        }

        #region Enable Button

        public void SetEnableButton(bool buttonLuu, bool buttonHuyBo, bool buttonXoa)
        {
            if (phieuXuatCurrent != null && phieuXuatCurrent.TrangThai == EnumTrangThaiPhieu.DaChotKy)
            {
                btnLuu.IsEnabled = false;
                btnHuyBo.IsEnabled = false;
                btnXoa.IsEnabled = false;
            }
            else
            {
                btnLuu.IsEnabled = buttonLuu;
                btnHuyBo.IsEnabled = buttonHuyBo;
                btnXoa.IsEnabled = buttonXoa;
            }
        }

        #endregion

        #region Set Quick Key

        public static RoutedCommand FocusHomeCommand = new RoutedCommand();

        private void FocusHomeCommandCanExecute(object sender, CanExecuteRoutedEventArgs e)
        {
            e.CanExecute = true;
        }

        private void FocusHomeCommandExecute(object sender, ExecutedRoutedEventArgs e)
        {
            try
            {
                tbvChiTiet.FocusedRowHandle = GridControl.NewItemRowHandle;
                tbvChiTiet.Focus();
                tbvChiTiet.FocusedColumn = colTenThuoc;
            }
            catch (Exception)
            {
                DXMessageBox.Show("Thiết lập foscus đến grid không thành công", "Thông báo", MessageBoxButton.OK, MessageBoxImage.Error);
            }
        }

        private void TbviewDanhSachDonThuoc_Loaded(object sender, RoutedEventArgs e)
        {
            try
            {
                tbvChiTiet.FocusedRowHandle = GridControl.NewItemRowHandle;
                tbvChiTiet.Focus();
                tbvChiTiet.FocusedColumn = colTenThuoc;
            }
            catch (Exception)
            {
                DXMessageBox.Show("Thiết lập foscus đến grid không thành công", "Thông báo", MessageBoxButton.OK, MessageBoxImage.Error);
            }
        }

        #endregion
    }
}
